#include "ListeBebete.h"
#include <stdlib.h> 
#include <cassert>

/* Initialisation de la liste de bebete avec une bebete et un pointeur à null */
void init_listebebete (Slistebebete* listb)
{
	(*listb).pbebete = new Sbebete ;
	init_bebete ((*listb).pbebete);
	(*listb).pbebetesuiv=NULL;
}

/* Cette fonction est un accesseur à une bebete donnée dans la liste de bebete
 * AUCUN DE SES PARAMETRES NE POURRA ETRE MODIFIE APRES SON EXECUTION.
 * Elle prend en paramètre un pointeur sur une structure liste bebete, 
 * les coordonnées de la bebete cherchée : X et Y.
 * Elle renvoie une bebete */
Sbebete* get_listebebete (const Slistebebete* listb, int Xatrouver, int Yatrouver)
{
	if ((listb==NULL) or ((*listb).pbebete==NULL))
	{
		return(NULL);
	}
	else
	{
		if ((((*(*listb).pbebete).X)==Xatrouver) and (((*(*listb).pbebete).Y)==Yatrouver))
		{
			return ((*listb).pbebete);
		}
		else
		{
			return (get_listebebete (((*listb).pbebetesuiv), Xatrouver, Yatrouver));
		}
	}
}


/* Cette procédure est un mutateur de la liste de bebete (perte de vie de la bebete).
 * ATTENTION, APRES SON EXECUTION, LES COORDONNES DE LA BEBETE SERA MODIFIE !
 * Elle prend en paramètres un pointeur sur une structure liste bebete 
 * et un pointeur sur une structure bebete */
void set_listebebete (Slistebebete* listb, const Sbebete* beb)
{
	Sbebete* pbebeteamodif;
	pbebeteamodif=get_listebebete(listb,(*beb).X ,(*beb).Y);
	pertedevie(pbebeteamodif);
}



/*  Fonction qui deplace toute la liste des bebetes une par une
 *  Elle prend en paramètres un pointeur sur une structure liste bebete 
 *  et un pointeur sur une structure terrain 
 *  attention : on ne pourra pas appeler cette fonction avec un pointeur liste bebete null*/

void deplacer (Slistebebete* listb, const Sterrain* ter) 
{
	assert(listb!=NULL);
	int i;
	i=1;
	Slistebebete* listetemp; 
	listetemp=listb;
	
	while( ((*listetemp).pbebetesuiv) != NULL)
	{
		deplacerdunecase((*listetemp).pbebete, ter);
		listetemp = (*listetemp).pbebetesuiv;
	}
	
	// on rajoute une itération car il en manque une dans le cas précédent
	deplacerdunecase((*listetemp).pbebete, ter);  
		
}




/*  Fonction qui permet d'ajouter une bebete à la liste
 *  Elle prend en paramètres un pointeur sur une structure liste bebete  */
void ajoutbebete (Slistebebete* listb)
{
    //création d'une nouvelle bebete
	
    Slistebebete* nouvellebebete;
	nouvellebebete = new Slistebebete;
	init_listebebete(nouvellebebete);
	
 
    if(listb == NULL)
    {
        // la liste est nulle donc on renvoit seulement la nouvelle bebete
        listb = nouvellebebete;
    }
    else
    {
        /*on parcourt la liste avec un pointeur temporaire temp et on ajoute la bebete à la fin
        indique que le dernier élément de la liste est relié au nouvel élément */
		Slistebebete* temp;
        temp=listb;
		while((*temp).pbebetesuiv != NULL)
        {
            temp = (*temp).pbebetesuiv;
        }
        (*temp).pbebetesuiv = nouvellebebete;
    }
}


/* Fonction qui permet de supprimer une bebete 
 * Elle prend en paramètre  un pointeur sur une structure liste bebete 
 * et un pointeur sur une structure bebete 
 * attention : on ne pourra pas appeler cette fonction avec un pointeur nul*/
void supbebete (Slistebebete*& listb, Sbebete* beb)
{
	assert (listb != NULL);	
	Sbebete* pbebeteasup;
	Slistebebete* ptempparent;
	Slistebebete* ptempcompte;
	Slistebebete* ptempsuivant;
	pbebeteasup=beb;
	ptempcompte=listb;
	
	// cas ou on veut supprimer la première bebete //
	if ((*ptempcompte).pbebete==pbebeteasup)
	{
		listb=(*ptempcompte).pbebetesuiv;
		delete (*ptempcompte).pbebete;
		(*ptempcompte).pbebete=NULL;
		delete ptempcompte;
		ptempcompte=NULL;
	}
	else // cas général
	{
		while ((*ptempcompte).pbebete!=pbebeteasup)
		{
			ptempparent=ptempcompte;
			ptempcompte=(*ptempcompte).pbebetesuiv;
		}
		ptempsuivant=(*ptempcompte).pbebetesuiv;
		delete (*ptempcompte).pbebete;
		(*ptempcompte).pbebete=NULL;
		delete ptempcompte;
		ptempcompte=NULL;
		(*ptempparent).pbebetesuiv=ptempsuivant;
	}
}

/* Fonction qui permet de vider la liste de bebete, notamment en fin de partie 
 * Elle prend en paramètre  un pointeur sur une structure liste bebete */
void vider_listebebete (Slistebebete* listb)
{
	if ((*listb).pbebetesuiv!=NULL)
	{
		vider_listebebete ((*listb).pbebetesuiv);
	}
	delete ((*listb).pbebete);
	(*listb).pbebete=NULL;
	delete (listb);
	listb=NULL;
}

/* Fonction qui compte le nombre de bebete dans la liste et qui renvoit ce nombre 
 * Elle prend en paramètre  un pointeur sur une structure liste bebete
 * Elle renvoit un entier qui correspond au nombre de bebete presentes dans la liste */
int nombre_bebetes (Slistebebete* listb)
{
	int i;
	i=0;
	Slistebebete* listetemp;
	listetemp=listb;
	while (listetemp!=NULL)
	{
		i++;
		listetemp=(*listetemp).pbebetesuiv;
	}
	return i;
}
